import org.junit.Assert;
import org.junit.Test;

public class 测试二元表达式 {

    @Test
    public void 测试乘法表达式() {
        var 解释器 = 测试工具.解释并执行("print 1 * 2\n");
        Assert.assertEquals(解释器.打印输出缓存.toString(), "2");
        测试工具.分割线();

        解释器 = 测试工具.解释并执行("print (1 + 2) * 3\n");
        Assert.assertEquals(解释器.打印输出缓存.toString(), "9");
        测试工具.分割线();

        解释器 = 测试工具.解释并执行("print 1.5 * 2.1\n");
        var 结果数值 = 解释器.打印输出缓存.substring(0, 4);
        var 当前值 = Float.parseFloat(结果数值);
        var 期望值 = 3.15f;
        Assert.assertTrue(测试工具.浮点相等(当前值, 期望值));
    }

    @Test
    public void 测试减法表达式() {
        var 解释器 = 测试工具.解释并执行("print 1 - 2\n");
        Assert.assertEquals(解释器.打印输出缓存.toString(), "-1");
        测试工具.分割线();

        解释器 = 测试工具.解释并执行("print (1 + 2) - 3\n");
        Assert.assertEquals(解释器.打印输出缓存.toString(), "0");
        测试工具.分割线();

        解释器 = 测试工具.解释并执行("print 1.5 - 2.1\n");
        var 结果数值 = 解释器.打印输出缓存.substring(0, 4);
        var 当前值 = Float.parseFloat(结果数值);
        var 期望值 = -0.6f;
        Assert.assertTrue(测试工具.浮点相等(当前值, 期望值));
    }
    
    
    @Test
    public void 测试判等表达式() {
        var 解释器 = 测试工具.解释并执行("print 1 == 2\n");
        Assert.assertEquals(解释器.打印输出缓存.toString(), "false");
        测试工具.分割线();

        解释器 = 测试工具.解释并执行("print 1 == 1\n");
        Assert.assertEquals(解释器.打印输出缓存.toString(), "true");
        测试工具.分割线();

        解释器 = 测试工具.解释并执行("print 1.5 == 2.1\n");
        Assert.assertEquals(解释器.打印输出缓存.toString(), "false");
        测试工具.分割线();

        解释器 = 测试工具.解释并执行("print 1.5 == 1.5\n");
        Assert.assertEquals(解释器.打印输出缓存.toString(), "true");
        测试工具.分割线();

        解释器 = 测试工具.解释并执行("print \"abc\" == 2.1\n");
        Assert.assertEquals(解释器.打印输出缓存.toString(), "false");
        测试工具.分割线();

        解释器 = 测试工具.解释并执行("print \"abc\" == \"abc\"\n");
        Assert.assertEquals(解释器.打印输出缓存.toString(), "true");
    }
    
    
    @Test
    public void 测试加法表达式() {
        var 解释器 = 测试工具.解释并执行("print 1 + 2\n");
        Assert.assertEquals(解释器.打印输出缓存.toString(), "3");
        测试工具.分割线();

        解释器 = 测试工具.解释并执行("print (1 + 2) + 3\n");
        Assert.assertEquals(解释器.打印输出缓存.toString(), "6");
        测试工具.分割线();

        解释器 = 测试工具.解释并执行("print 1.5 + 2.1\n");
        Assert.assertEquals(解释器.打印输出缓存.toString(), "3.6");
        测试工具.分割线();

        解释器 = 测试工具.解释并执行("print \"abc\" + 2.1\n");
        Assert.assertEquals(解释器.打印输出缓存.toString(), "abc2.1");
    }

    @Test
    public void 测试小于表达式() {
        var 解释器 = 测试工具.解释并执行("print 1 < 2\n");
        Assert.assertEquals(解释器.打印输出缓存.toString(), "true");
        测试工具.分割线();

        解释器 = 测试工具.解释并执行("print 1 < 1\n");
        Assert.assertEquals(解释器.打印输出缓存.toString(), "false");
        测试工具.分割线();

        解释器 = 测试工具.解释并执行("print 1.5 < 2.1\n");
        Assert.assertEquals(解释器.打印输出缓存.toString(), "true");
    }
}
